//给定一个大小为 n 的数组 nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
//
//你可以假设数组是非空的，并且给定的数组总是存在多数元素。
//
//来源：力扣（LeetCode）
//链接：https://leetcode.cn/problems/majority-element
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
fun main() {
//    val intArray = intArrayOf(2, 2, 1, 1, 1, 2, 2)
//    val intArray = intArrayOf(6, 6, 6, 7, 7)
//    val intArray = intArrayOf(6, 5, 5)
//    val intArray = intArrayOf(6, 5, 5, 5, 4)
    val intArray = intArrayOf(-1, 1, 1, 1, 2, 1)

//    println(e5_2(intArray))
    println(e5_3(intArray))
//    println(e5(intArray))
}

fun e5_3(nums: IntArray): Int {
    val size = nums.size
    val max = size / 2f
    var m = nums[0]
    var count = 1
    for (i in 1 until size) {
        if (m == nums[i]) {
            count++
        } else {
            count--
            if (count == 0) {
                m = nums[i+1]
            }
        }
        if (count >= max) return m
    }
    return m
}

fun e5_2(nums: IntArray): Int {
    val map = mutableMapOf<Int, Int>()
    val max = nums.size / 2f
    for (num in nums) {
        if (map.containsKey(num)) {
            val i = map[num]!! + 1
            if (i > max) {
                return num
            }
            map[num] = i
        } else {
            map[num] = 1
        }
    }
    return nums[0]
}

fun e5(nums: IntArray): Int {
    val size = nums.size
    val p: Float = size / 2f
    var mark: Int
    for (i in 0 until size) {
        val i1 = i + 1
        mark = 1
        for (i2 in i1 until size) {
            if (nums[i] == nums[i2]) mark++
            if (mark >= p) return nums[i]
        }
    }
    return nums[0]
}